
import bpy



from 节点.全局控制.Node.节点和插座基类 import bl_节点基类
from 节点.Core import bl_UI配色
from 节点.Core import bl_Mesh

import engine.initLIB.load_dll as engineLib
import ctypes


engineLib.flexCAPI.f_创建粒子节点.restype = ctypes.c_bool
engineLib.flexCAPI.f_创建粒子发射器节点.restype = ctypes.c_bool
engineLib.flexCAPI.f_创建粒子年龄节点.restype = ctypes.c_bool


engineLib.flexCAPI.f_创建粒子成员展开节点.restype = ctypes.c_bool
engineLib.flexCAPI.f_创建粒子成员收起节点.restype = ctypes.c_bool

engineLib.flexCAPI.f_创建粒子物理节点.restype = ctypes.c_bool
engineLib.flexCAPI.f_创建粒子渲染节点.restype = ctypes.c_bool







class C_Node_粒子(bl_节点基类.C_Node_基类):
	bl_dname = 'bl_node_粒子'
	bl_label = '粒子'
	
	def init(self, context):
		super(C_Node_粒子, self).f_init(context)
		self.inputs.new('C_Socket_UI32', name='粒子数量')
		self.outputs.new('C_NodeSocket_粒子系统', name='粒子')
		
		self.f_toCPP(self.id_data);
		self.inputs['粒子数量'].f_setData(100);
		
	def f_toCPP(self, tree):
		未创建 = engineLib.flexCAPI.f_创建粒子节点(ctypes.c_wchar_p(tree.name), ctypes.c_wchar_p(self.name), self.f_getPyObject(tree));
		if 未创建 :
			self.use_custom_color = True
			self.color = bl_UI配色.g_粒子节点颜色

			for s in self.inputs:
				s.f_update()
		

	'''def f_初始内部节点(self, tree):
		是否更新 = engineLib.flexCAPI.f_创建粒子节点(ctypes.c_wchar_p(self.id_data.name), ctypes.c_wchar_p(self.name), self.f_get_节点指针(tree));
		if 是否更新 :
			self.inputs['粒子数量'].f_update()

			self.use_custom_color = True
			self.color = bl_UI配色.g_粒子节点颜色'''


class C_NODE_MENU_粒子(bpy.types.Operator):
	bl_idname = 'node.global_node_particle_system'
	bl_label = '粒子'
	bl_options = {'REGISTER', 'UNDO'}
	def execute(operator, context):
		bpy.ops.node.add_node(type='C_Node_粒子', use_transform=True)
		return {'FINISHED'}













E_粒子发射器类型枚举 = [
	("TYPE_发射器类型_点", "点", "", 0),
	("TYPE_发射器类型_线", "线", "", 1),
	("TYPE_发射器类型_面", "面", "", 2),
	("TYPE_发射器类型_体", "体", "", 3),
]

E_粒子发射方式枚举 = [
	("TYPE_发射方式_数量", "数量", "", 0),
	("TYPE_发射方式_速率", "速率", "", 1),
]

def f_update_粒子发射器类型(self, context):
	data = list(str(self.m_粒子发射器类型))
	engineLib.flexCAPI.f_node_传入BL数据(ctypes.c_wchar_p(self.id_data.name), ctypes.c_wchar_p(self.name), ctypes.py_object(data));
	if context :
		self.id_data.f_节点数据更新_更新树([self])

def f_update_粒子发射方式(self, context):
	data = list(str(self.m_粒子发射方式))
	engineLib.flexCAPI.f_node_传入BL数据(ctypes.c_wchar_p(self.id_data.name), ctypes.c_wchar_p(self.name), ctypes.py_object(data));
	if context :
		self.id_data.f_节点数据更新_更新树([self])

class C_Node_粒子发射器(bl_节点基类.C_Node_基类):
	bl_dname = 'bl_node_粒子粒子发射器'
	bl_label = '粒子粒子发射器'
	
	m_粒子发射器类型 = bpy.props.EnumProperty(items=E_粒子发射器类型枚举, name="发射器类型", default="TYPE_发射器类型_点", update=f_update_粒子发射器类型)
	m_粒子发射方式 = bpy.props.EnumProperty(items=E_粒子发射方式枚举, name="发射方式", default="TYPE_发射方式_数量", update=f_update_粒子发射方式)
	def init(self, context):
		super(C_Node_粒子发射器, self).f_init(context)
		self.inputs.new('C_NodeSocket_粒子系统', name='粒子')
		self.inputs.new('C_Socket_网格', name='发射体')
		
		self.inputs.new('C_Socket_Vec3_Array1D', name='初始旋转')
		self.inputs.new('C_Socket_Vec3_Array1D', name='初始速度')
		self.inputs.new('C_Socket_F32_Array1D', name='初始大小')
		self.inputs.new('C_Socket_F32_Array1D', name='初始寿命')
		
		self.inputs.new('C_Socket_F32', name='发射数量')
		self.inputs.new('C_Socket_F32', name='时间')
		
		self.outputs.new('C_NodeSocket_粒子系统', name='粒子')
		self.outputs.new('C_Socket_UI32_Array1D', name='发射粒子索引')
		
		self.inputs['初始大小'].f_setData(0.1)
		self.inputs['初始寿命'].f_setData(10.0)
		
		self.f_toCPP(self.id_data);
		
		
	def f_toCPP(self, tree):
		是否更新 = engineLib.flexCAPI.f_创建粒子发射器节点(ctypes.c_wchar_p(tree.name), ctypes.c_wchar_p(self.name), self.f_getPyObject(tree));
		if 是否更新 :
			self.use_custom_color = True
			self.color = bl_UI配色.g_粒子节点颜色
		else:
			self.inputs['初始旋转'].f_update()
			self.inputs['初始速度'].f_update()
			self.inputs['初始大小'].f_update()
			self.inputs['初始寿命'].f_update()
			
			self.inputs['发射数量'].f_update()
			self.inputs['时间'].f_update()

			
class C_NODE_MENU_粒子粒子发射器(bpy.types.Operator):
	bl_idname = 'node.global_node_particle_emission'
	bl_label = '粒子粒子发射器'
	bl_options = {'REGISTER', 'UNDO'}
	def execute(operator, context):
		bpy.ops.node.add_node(type='C_Node_粒子发射器', use_transform=True)
		return {'FINISHED'}
		















class C_Node_粒子年龄(bl_节点基类.C_Node_基类):
	bl_dname = 'bl_node_粒子年龄'
	bl_label = '粒子年龄'
	
	def init(self, context):
		super(C_Node_粒子年龄, self).f_init(context)
		self.inputs.new('C_NodeSocket_粒子系统', name='粒子')
		self.inputs.new('C_Socket_F32', name='当前时间')
		self.outputs.new('C_Socket_F32_Array1D', name='年龄')
		
		
		self.f_toCPP();
		
		
	def f_toCPP(self):
		是否更新 = engineLib.flexCAPI.f_创建粒子年龄节点(ctypes.c_wchar_p(self.id_data.name), ctypes.c_wchar_p(self.name), self.f_getPyObject());
		if 是否更新 :
			self.use_custom_color = True
			self.color = bl_UI配色.g_粒子节点颜色
		
class C_NODE_MENU_粒子年龄(bpy.types.Operator):
	bl_idname = 'node.global_node_particle_age'
	bl_label = '粒子年龄'
	bl_options = {'REGISTER', 'UNDO'}
	def execute(operator, context):
		bpy.ops.node.add_node(type='C_Node_粒子年龄', use_transform=True)
		return {'FINISHED'}


















class C_Node_粒子成员展开(bl_节点基类.C_Node_基类):
	bl_dname = 'bl_node_粒子成员展开'
	bl_label = '粒子成员展开'
	
	def init(self, context):
		super(C_Node_粒子成员展开, self).f_init(context)
		self.inputs.new('C_NodeSocket_粒子系统', name='粒子')

		self.outputs.new('C_NodeSocket_粒子系统', name='粒子')
		self.outputs.new('C_Socket_引用', name='坐标')
		self.outputs.new('C_Socket_引用', name='速度')
		self.outputs.new('C_Socket_引用', name='旋转')
		self.outputs.new('C_Socket_引用', name='大小')
		self.outputs.new('C_Socket_引用', name='出生')
		self.outputs.new('C_Socket_引用', name='状态')
		
		
		self.f_toCPP();
		
		
	def f_toCPP(self):
		是否更新 = engineLib.flexCAPI.f_创建粒子成员展开节点(ctypes.c_wchar_p(self.id_data.name), ctypes.c_wchar_p(self.name), self.f_getPyObject());
		if 是否更新 :
			self.use_custom_color = True
			self.color = bl_UI配色.g_粒子节点颜色

			
class C_NODE_MENU_粒子成员展开(bpy.types.Operator):
	bl_idname = 'node.global_node_particle_member_expansion'
	bl_label = '粒子成员展开'
	bl_options = {'REGISTER', 'UNDO'}
	def execute(operator, context):
		bpy.ops.node.add_node(type='C_Node_粒子成员展开', use_transform=True)
		return {'FINISHED'}





class C_Node_粒子成员收起(bl_节点基类.C_Node_基类):
	bl_dname = 'bl_node_粒子成员展开'
	bl_label = '粒子成员收起'
	
	def init(self, context):
		super(C_Node_粒子成员收起, self).f_init(context)
		self.inputs.new('C_NodeSocket_粒子系统', name='粒子')

		self.inputs.new('C_Socket_引用', name='坐标')
		self.inputs.new('C_Socket_引用', name='速度')
		self.inputs.new('C_Socket_引用', name='旋转')
		self.inputs.new('C_Socket_引用', name='大小')
		self.inputs.new('C_Socket_引用', name='出生')
		self.inputs.new('C_Socket_引用', name='状态')
		
		self.outputs.new('C_NodeSocket_粒子系统', name='粒子')

		
		self.f_toCPP();
		
		
	def f_toCPP(self):
		是否更新 = engineLib.flexCAPI.f_创建粒子成员收起节点(ctypes.c_wchar_p(self.id_data.name), ctypes.c_wchar_p(self.name), self.f_getPyObject());
		if 是否更新 :
			self.use_custom_color = True
			self.color = bl_UI配色.g_粒子节点颜色
		
class C_NODE_MENU_粒子成员收起(bpy.types.Operator):
	bl_idname = 'node.global_node_particle_member_fold'
	bl_label = '粒子成员收起'
	bl_options = {'REGISTER', 'UNDO'}
	def execute(operator, context):
		bpy.ops.node.add_node(type='C_Node_粒子成员收起', use_transform=True)
		return {'FINISHED'}















class C_Node_粒子物理(bl_节点基类.C_Node_基类):
	bl_dname = 'bl_node_粒子物理'
	bl_label = '粒子物理'
	
	def init(self, context):
		super(C_Node_粒子物理, self).f_init(context)
		self.inputs.new('C_NodeSocket_粒子系统', name='粒子')
		self.inputs.new('C_Socket_物体_Array1D', name='物理体')
		
		self.outputs.new('C_NodeSocket_粒子系统', name='粒子')
		
		self.f_toCPP(self.id_data);
		
	def f_toCPP(self, tree):
		未创建 = engineLib.flexCAPI.f_创建粒子物理节点(ctypes.c_wchar_p(tree.name), ctypes.c_wchar_p(self.name), self.f_getPyObject(tree));
		if 未创建 :
			self.use_custom_color = True
			self.color = bl_UI配色.g_粒子节点颜色

		
class C_NODE_MENU_粒子物理(bpy.types.Operator):
	bl_idname = 'node.global_node_particle_physics'
	bl_label = '粒子物理'
	bl_options = {'REGISTER', 'UNDO'}
	def execute(operator, context):
		bpy.ops.node.add_node(type='C_Node_粒子物理', use_transform=True)
		return {'FINISHED'}











class C_Node_粒子渲染(bl_节点基类.C_Node_基类):
	bl_dname = 'bl_node_粒子渲染'
	bl_label = '粒子渲染'
	
	def init(self, context):
		super(C_Node_粒子渲染, self).f_init(context)
		self.inputs.new('C_NodeSocket_粒子系统', name='粒子')
		self.inputs.new('C_Socket_引用', name='实例体')
		#self.inputs.new('C_Socket_材质_Array1D', name='材质')
		self.outputs.new('C_NodeSocket_粒子系统', name='粒子')
		
		self.f_toCPP();
		
	def f_toCPP(self):
		是否更新 = engineLib.flexCAPI.f_创建粒子渲染节点(ctypes.c_wchar_p(self.id_data.name), ctypes.c_wchar_p(self.name), self.f_getPyObject());
		if 是否更新 :
			self.use_custom_color = True
			self.color = bl_UI配色.g_粒子节点颜色

		
class C_NODE_MENU_粒子渲染(bpy.types.Operator):
	bl_idname = 'node.global_node_particle_render'
	bl_label = '粒子渲染'
	bl_options = {'REGISTER', 'UNDO'}
	def execute(operator, context):
		bpy.ops.node.add_node(type='C_Node_粒子渲染', use_transform=True)
		return {'FINISHED'}








classes = (
	C_Node_粒子,
	C_NODE_MENU_粒子,

	C_Node_粒子发射器,
	C_NODE_MENU_粒子粒子发射器,
	
	C_Node_粒子年龄,
	C_NODE_MENU_粒子年龄,


	C_Node_粒子成员展开,
	C_NODE_MENU_粒子成员展开,
	C_Node_粒子成员收起,
	C_NODE_MENU_粒子成员收起,


	C_Node_粒子物理,
	C_NODE_MENU_粒子物理,
	C_Node_粒子渲染,
	C_NODE_MENU_粒子渲染,

)

def register():
	for c in classes:
		bpy.utils.register_class(c)
		
def unregister():
	for c in classes:
		bpy.utils.unregister_class(c)






